/*!
 * \file MQManager.h
 * \project	WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief 消息队列管理器头文件
 * 
 * \details 本文件定义了WonderTrader消息队列系统的管理器类：
 *          - 统一管理消息服务器和客户端实例
 *          - 提供服务器和客户端的创建、销毁接口
 *          - 实现消息发布和订阅功能的统一调度
 *          - 支持多个服务器和客户端的并发管理
 *          - 提供日志回调和错误处理机制
 *          - 基于UDP协议实现高性能消息传输
 */
#pragma once
#include "PorterDefs.h"
#include "MQServer.h"
#include "MQClient.h"

#include "../Includes/FasterDefs.h"
#include "../Share/StdUtils.hpp"

NS_WTP_BEGIN

#pragma warning(disable:4200)

#pragma pack(push,1)
/**
 * @brief UDP消息包结构体
 * @details 定义UDP传输的消息包格式，包含主题、长度和数据
 */
typedef struct _MQPacket
{
	char			_topic[32];		/*!< 消息主题，最大32字节 */
	uint32_t		_length;		/*!< 消息数据长度 */
	char			_data[0];		/*!< 消息数据，变长数组 */
} MQPacket;
#pragma pack(pop)

typedef std::shared_ptr<MQServer> MQServerPtr;
typedef std::shared_ptr<MQClient> MQClientPtr;

/**
 * @brief 消息队列管理器类
 * @details 负责管理所有的消息服务器和客户端实例，提供统一的接口进行消息队列操作
 */
class MQManager
{
public:
	/**
	 * @brief 构造函数
	 * @details 初始化消息队列管理器，设置日志回调为空
	 */
	MQManager() : _cb_log(NULL) {}

public:
	/**
	 * @brief 注册回调函数
	 * @details 注册日志回调函数，用于接收系统日志信息
	 * @param cbLog 日志回调函数指针
	 */
	inline void		regiter_callbacks(FuncLogCallback cbLog) { _cb_log = cbLog; }

	/**
	 * @brief 创建消息服务器
	 * @details 创建新的消息服务器实例并返回唯一ID
	 * @param url 服务器URL地址
	 * @param confirm 是否启用确认机制
	 * @return WtUInt32 服务器唯一标识ID
	 */
	WtUInt32	create_server(const char* url, bool confirm);
	
	/**
	 * @brief 销毁消息服务器
	 * @details 根据ID销毁指定的消息服务器实例
	 * @param id 服务器ID
	 */
	void		destroy_server(WtUInt32 id);
	
	/**
	 * @brief 发布消息
	 * @details 通过指定服务器发布消息到指定主题
	 * @param id 服务器ID
	 * @param topic 消息主题
	 * @param data 消息数据指针
	 * @param dataLen 消息数据长度
	 */
	void		publish_message(WtUInt32 id, const char* topic, const void* data, WtUInt32 dataLen);

	/**
	 * @brief 创建消息客户端
	 * @details 创建新的消息客户端实例并返回唯一ID
	 * @param url 服务器URL地址
	 * @param cb 消息接收回调函数
	 * @return WtUInt32 客户端唯一标识ID
	 */
	WtUInt32	create_client(const char* url, FuncMQCallback cb);
	
	/**
	 * @brief 销毁消息客户端
	 * @details 根据ID销毁指定的消息客户端实例
	 * @param id 客户端ID
	 */
	void		destroy_client(WtUInt32 id);
	
	/**
	 * @brief 订阅主题
	 * @details 为指定客户端订阅消息主题
	 * @param id 客户端ID
	 * @param topic 要订阅的主题名称
	 */
	void		sub_topic(WtUInt32 id, const char* topic);
	
	/**
	 * @brief 启动客户端
	 * @details 启动指定的消息客户端，开始接收消息
	 * @param id 客户端ID
	 */
	void		start_client(WtUInt32 id);

	/**
	 * @brief 服务器日志记录
	 * @details 记录服务器相关的日志信息
	 * @param id 服务器ID
	 * @param message 日志消息内容
	 */
	void		log_server(WtUInt32 id, const char* message);
	
	/**
	 * @brief 客户端日志记录
	 * @details 记录客户端相关的日志信息
	 * @param id 客户端ID
	 * @param message 日志消息内容
	 */
	void		log_client(WtUInt32 id, const char* message);

private:
	typedef faster_hashmap<uint32_t, MQServerPtr> ServerMap;
	ServerMap	_servers;		/*!< 服务器实例映射表 */

	typedef faster_hashmap<uint32_t, MQClientPtr> ClientMap;
	ClientMap	_clients;		/*!< 客户端实例映射表 */

	FuncLogCallback	_cb_log;	/*!< 日志回调函数指针 */
};

NS_WTP_END
